package com.trhui.mallbook.domain.request.hf;

import com.trhui.mallbook.domain.common.BaseRequest;
import com.trhui.mallbook.domain.request.Goods;
import com.trhui.mallbook.domain.request.PaymentOrderUser;

import java.util.List;

/**
 * 汇付渠道支付请求对象
 *
 * @author linqy
 */
public class HfPaymentOrderRequest extends BaseRequest {

    /**
     * 业务系统订单号(必填)
     */
    private String bizOrderId;

    /**
     * 交易金额(必填)
     * 如1.12元，传的时候乘以100，值为：112；
     * 交易金额必须大于0
     * 交易金额=总分账金额
     */
    private String amount;

    /**
     * 付款方子商户编号
     * 当支付类型为快捷支付或余额支付时必传
     */
    private String payerUserId;
    /**
     * 付款人
     */
    private String payerUserName;

    /**
     * 收款人会员ID(必填)
     * 1.非异步订单必填
     * 2.渠道类型为拉卡拉时必填
     * 3.当为异步订单，渠道类型为汇付，可传可不传。如果没有传，可执行多次异步分账；否则只能执行一次异步分账。
     */
    private String payeeUserId;

    /**
     * 订单名称(必填)
     */
    private String orderName;

    /**
     * 支付类型(必填)
     * WX_JSAPI：微信公众号
     * WX_MINI：微信小程序
     * WX_APP：微信APP
     * ALI_CB：支付宝C扫B
     * ALI_JSAPI：支付宝生活号
     * ALI_MINI：支付宝小程序
     * ALI_APP：支付宝APP
     * ALI_H5：支付宝H5支付
     * SCAN：付款码支付
     * B2C：个人网银支付
     * B2B：企业网银支付
     * FAST_PAY：快捷支付
     * BALANCE：余额支付
     * UNIONPAY_CB：银联云闪付C扫B
     * UNIONPAY_SDK：银联云闪付SDK支付
     * WX_CB：微信C扫B
     * BANK_TRANSFER：银行转账支付
     * 渠道类型为汇付除了微信APP支付外，其他支付类型都支持，余额支付、网银支付、快捷支付需要申请。
     */
    private String payType;

    /**
     * 交易类型(必填)
     * 0：担保交易，需要调用确认收货接口，资金才会划转到对方账户；
     * 1：直接支付，支付成功后，资金直接划转到对方账户中。
     */
    private String transferType;

    /**
     * 订单过期时间
     * 格式：yyyy-MM-dd HH:mm:ss
     * 渠道类型为拉卡拉，默认过期时间24小时（除支付宝C扫B）
     * 渠道类型为汇付，非反扫类默认过期时间2小时。
     */
    private String expire;

    /**
     * 微信或支付宝的appid
     */
    private String appid;

    /**
     * 微信或支付宝用户id
     */
    private String openid;

    /**
     * 终端IP(必填)
     * 支付类型为条码支付时，上传商家的终端IP
     * 支付类型为B2C、B2B时，上传发起支付的用户端IP
     * 其他支付类型上传支付者IP
     */
    private String terminalIp;

    /**
     * 分账方列表(必填)
     * 渠道类型为汇付，收款方子商户编号不为空时，分账方列表只支持传1个分账方，并且与收款人子商户编号一致，只能支持一次全部异步分账。
     * 渠道类型为汇付，收款方子商户编号为空时，分账方列表也必须为空，可支持多次异步分账。
     */
    private List<PaymentOrderUser> splitList;

    /**
     * 商品列表(必填)
     */
    private List<Goods> goodsDetail;

    /**
     * 前台回调地址(必填)
     */
    private String frontUrl;

    /**
     * 后台回调地址(必填)
     */
    private String notifyUrl;

    /**
     * 自定义参数1
     */
    private String parameter1;

    /**
     * 自定义参数2
     */
    private String parameter2;
    /**
     * 是否异步分账
     * 0：否 1：是
     * 当交易类型为直接支付时，不支持异步分账。
     * 渠道类型为平安银行，不支持异步分账
     */
    private String asynSplitFlag;

    /**
     * 是否多次异步分账
     * 1：是
     * 0：否
     */
    private String asynSplitMoreFlag;

    /**
     * 银行编码
     * 当支付类型为B2C、B2B时必传
     */
    private String bankCode;

    /**
     * 银行卡类型
     * 当支付类型为B2C、B2B时必传
     * debit：借记卡
     * credit：贷记卡
     */
    private String cardType;

    /**
     * 快捷卡唯一标识
     */
    private String tokenNo;

    /**
     * 付款码
     */
    private String authCode;

    /**
     * 分账模板编号
     * 异步分账订单不支持使用分账模板；
     * 分账模板编号、分账方列表只能传其中之一。
     */
    private String splitTemplateNo;

    /**
     * 支付完成页面自定义信息
     * 最多三组数据
     * 主要对于微信公众号支付，微信点金计划页面展示的内容进行定义，如果不需要自定义或使用商户平台的点金计划页面可不传该参数。格式如下：
     * {
     * "订单号": "2020102000001",
     * "优惠金额": "10.00"
     * }
     */
    private String payCompleteInfo;

    /**
     * 业务系统APP Schema
     * 支付宝APP支付，支付完成后需要返回app。所填写的
     * appSchema与业务系统APP的scheme名字一致，并且在appSchema后面带上://。
     * 例如：
     * App中的scheme为MallBook
     * 则该参数传参为MallBook://
     */
    private String appSchema;

    /**
     * 渠道支付商户号
     * 当支付不从MallBook发起时必传
     */
    private String payChannelMerNo;

    /**
     * 渠道支付订单号
     * 当支付不从MallBook发起时必传
     */
    private String channelOrderId;
    /**
     * 是否托管下单
     * 0：否
     * 1：是
     * 只支持微信小程序托管下单，其他支付类型不传值或传0：否
     */
    private String tutelageFlag;
    /**
     * 跳回微信小程序路径
     * 支付类型为【微信小程序支付】，且小程序托管下单为【是】时，必填
     */
    private String navigateMiniPath;
    /**
     * 跳回微信小程序appid
     * 支付类型为【微信小程序支付】，且小程序托管下单为【是】时，必填
     */
    private String navigateMiniAppid;
    /**
     * 微信小程序版本
     * develop：开发版
     * trial：体验版
     * release正式版
     *
     * 支付类型为【微信小程序支付】，且小程序托管下单为【是】时，必填
     * 仅在当前小程序为开发版或体验版时此参数有效。如果当前小程序是正式版，则打开的小程序必定是正式版。
     */
    private String envVersion;
    /**
     * 应用发起端类型
     * 0：微信小程序（默认）
     * 1：APP
     * 2：移动端浏览器（支持微信H5和手机浏览器H5）
     * 当是否托管下单为是时有效
     */
    private String appInitiatorType;
    /**
     * 返回原APP的参数
     * 从托管小程序返回原APP的参数
     * 当是否托terminalId管下单为是时有效
     */
    private String appParameter;
    /**
     * 设备终端号
     * 支付类型为【付款码支付】时，必填
     */
    private String terminalId;
    /**
     * 验证类型
     * 支付类型为【银行转账支付】时，必填
     * 2：⼆要素，⾦额、标识
     * 3：三要素，⾦额、标识、打款⼈名称
     * 4：四要素，⾦额、标识、打款⼈名称、打款⼈账号
     */
    private String elementsType;
    /**
     * 打款人姓名
     * 支付类型为【银行转账支付】时使用，验证类型为三、四要素时必填；否则不传
     */
    private String cardName;
    /**
     * 打款人账号
     * 支付类型为【银行转账支付】时使用，验证类型为四要素时必填；否则不传
     */
    private String cardNo;
    /**
     * 微信支付分请求订单号
     */
    private String wxPayScoreMerOrderId;

    public String getWxPayScoreMerOrderId() {
        return wxPayScoreMerOrderId;
    }

    public void setWxPayScoreMerOrderId(String wxPayScoreMerOrderId) {
        this.wxPayScoreMerOrderId = wxPayScoreMerOrderId;
    }

    public String getTutelageFlag() {
        return tutelageFlag;
    }

    public void setTutelageFlag(String tutelageFlag) {
        this.tutelageFlag = tutelageFlag;
    }

    public String getNavigateMiniPath() {
        return navigateMiniPath;
    }

    public void setNavigateMiniPath(String navigateMiniPath) {
        this.navigateMiniPath = navigateMiniPath;
    }

    public String getNavigateMiniAppid() {
        return navigateMiniAppid;
    }

    public void setNavigateMiniAppid(String navigateMiniAppid) {
        this.navigateMiniAppid = navigateMiniAppid;
    }

    public String getEnvVersion() {
        return envVersion;
    }

    public void setEnvVersion(String envVersion) {
        this.envVersion = envVersion;
    }

    public String getAppInitiatorType() {
        return appInitiatorType;
    }

    public void setAppInitiatorType(String appInitiatorType) {
        this.appInitiatorType = appInitiatorType;
    }

    public String getAppParameter() {
        return appParameter;
    }

    public void setAppParameter(String appParameter) {
        this.appParameter = appParameter;
    }

    public String getTerminalId() {
        return terminalId;
    }

    public void setTerminalId(String terminalId) {
        this.terminalId = terminalId;
    }

    public String getElementsType() {
        return elementsType;
    }

    public void setElementsType(String elementsType) {
        this.elementsType = elementsType;
    }

    public String getCardName() {
        return cardName;
    }

    public void setCardName(String cardName) {
        this.cardName = cardName;
    }

    public String getCardNo() {
        return cardNo;
    }

    public void setCardNo(String cardNo) {
        this.cardNo = cardNo;
    }

    public String getPayerUserId() {
        return payerUserId;
    }

    public void setPayerUserId(String payerUserId) {
        this.payerUserId = payerUserId;
    }

    public String getBankCode() {
        return bankCode;
    }

    public void setBankCode(String bankCode) {
        this.bankCode = bankCode;
    }

    public String getCardType() {
        return cardType;
    }

    public void setCardType(String cardType) {
        this.cardType = cardType;
    }

    public String getTokenNo() {
        return tokenNo;
    }

    public void setTokenNo(String tokenNo) {
        this.tokenNo = tokenNo;
    }

    public String getAsynSplitFlag() {
        return asynSplitFlag;
    }

    public void setAsynSplitFlag(String asynSplitFlag) {
        this.asynSplitFlag = asynSplitFlag;
    }

    public String getBizOrderId() {
        return bizOrderId;
    }

    public void setBizOrderId(String bizOrderId) {
        this.bizOrderId = bizOrderId;
    }

    public String getAmount() {
        return amount;
    }

    public void setAmount(String amount) {
        this.amount = amount;
    }

    public String getPayerUserName() {
        return payerUserName;
    }

    public void setPayerUserName(String payerUserName) {
        this.payerUserName = payerUserName;
    }

    public String getPayeeUserId() {
        return payeeUserId;
    }

    public void setPayeeUserId(String payeeUserId) {
        this.payeeUserId = payeeUserId;
    }

    public String getOrderName() {
        return orderName;
    }

    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }

    public String getPayType() {
        return payType;
    }

    public void setPayType(String payType) {
        this.payType = payType;
    }

    public String getTransferType() {
        return transferType;
    }

    public void setTransferType(String transferType) {
        this.transferType = transferType;
    }

    public String getExpire() {
        return expire;
    }

    public void setExpire(String expire) {
        this.expire = expire;
    }

    public String getAppid() {
        return appid;
    }

    public void setAppid(String appid) {
        this.appid = appid;
    }

    public String getOpenid() {
        return openid;
    }

    public void setOpenid(String openid) {
        this.openid = openid;
    }

    public String getTerminalIp() {
        return terminalIp;
    }

    public void setTerminalIp(String terminalIp) {
        this.terminalIp = terminalIp;
    }

    public List<PaymentOrderUser> getSplitList() {
        return splitList;
    }

    public void setSplitList(List<PaymentOrderUser> splitList) {
        this.splitList = splitList;
    }

    public List<Goods> getGoodsDetail() {
        return goodsDetail;
    }

    public void setGoodsDetail(List<Goods> goodsDetail) {
        this.goodsDetail = goodsDetail;
    }

    public String getFrontUrl() {
        return frontUrl;
    }

    public void setFrontUrl(String frontUrl) {
        this.frontUrl = frontUrl;
    }

    public String getNotifyUrl() {
        return notifyUrl;
    }

    public void setNotifyUrl(String notifyUrl) {
        this.notifyUrl = notifyUrl;
    }

    public String getParameter1() {
        return parameter1;
    }

    public void setParameter1(String parameter1) {
        this.parameter1 = parameter1;
    }

    public String getParameter2() {
        return parameter2;
    }

    public void setParameter2(String parameter2) {
        this.parameter2 = parameter2;
    }

    public String getAuthCode() {
        return authCode;
    }

    public void setAuthCode(String authCode) {
        this.authCode = authCode;
    }

    public String getSplitTemplateNo() {
        return splitTemplateNo;
    }

    public void setSplitTemplateNo(String splitTemplateNo) {
        this.splitTemplateNo = splitTemplateNo;
    }

    public String getPayCompleteInfo() {
        return payCompleteInfo;
    }

    public void setPayCompleteInfo(String payCompleteInfo) {
        this.payCompleteInfo = payCompleteInfo;
    }

    public String getAppSchema() {
        return appSchema;
    }

    public void setAppSchema(String appSchema) {
        this.appSchema = appSchema;
    }

    public String getPayChannelMerNo() {
        return payChannelMerNo;
    }

    public void setPayChannelMerNo(String payChannelMerNo) {
        this.payChannelMerNo = payChannelMerNo;
    }

    public String getChannelOrderId() {
        return channelOrderId;
    }

    public void setChannelOrderId(String channelOrderId) {
        this.channelOrderId = channelOrderId;
    }

    public String getAsynSplitMoreFlag() {
        return asynSplitMoreFlag;
    }

    public void setAsynSplitMoreFlag(String asynSplitMoreFlag) {
        this.asynSplitMoreFlag = asynSplitMoreFlag;
    }
}
